﻿using Domain.Database;
using Domain.Mapping;
using System.Data.Entity;

namespace Domain.DbContext
{
    public class ModelContainer : System.Data.Entity.DbContext
    {
        public ModelContainer()
            : base("name=ModelContainer")
        {
            this.Configuration.AutoDetectChangesEnabled = false;//自动侦查对象的属性变化(开启此功能，SaveChanges()前,自动调用Dbcontext.ChangeTracker.DetectChanges()跟踪对象属性[基础属性+导航属性]的变化。如果关闭此功能，Dbcontext就只有基于快照的变化跟踪[基础属性]。PS:即使关闭了延迟加载和代理类功能，此功能依旧生效)
            this.Configuration.ValidateOnSaveEnabled = false;//保存前验证对象的属性最大最小长度等(数据库做校验，EF不做校验)
            this.Configuration.LazyLoadingEnabled = false;//延迟加载（配合代理类功能使用，即导航属性的延迟加载，用于查询）
            this.Configuration.ProxyCreationEnabled = false;//代理类


            //LogHelper.WriteDebugLog(this.GetType(),"ModelContainer生产了");
            //Database.Log = logMessage =>//EF开启sql语句记录
            //{
            //    if (!string.IsNullOrEmpty(logMessage.Trim()) && !(logMessage.Trim().Contains("已于") || logMessage.Trim().Contains("已在") || logMessage.Trim().Contains("正在")))
            //    {
            //        LogHelper.WriteDebugLog(this.GetType(), null, "Sql内容：" + logMessage);
            //    }
            //};
        }

        /// <summary>
        /// 首次使用DbContext时，触发模型创建方法，在内存中创建一份mapping views(会校验与数据库是否一致)，这是个耗时操作，后续的同类型DbContext不在调用此方法。
        /// </summary>
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//关闭复数表名映射,利用代码生成数据库时才生效，此处被EntityTypeConfiguration覆写

            //modelBuilder.HasDefaultSchema("");

            modelBuilder.Configurations.Add(new TestMap());
            modelBuilder.Configurations.Add(new UserInfoMap());
            modelBuilder.Configurations.Add(new ConfigMap());
        }

        public DbSet<Test> Tests { get; set; }
        public DbSet<UserInfo> UserInfoes { get; set; }
        public DbSet<Config> Configs { get; set; }
    }
}